package main

import "fmt"

//Go中的内置反射机制。
//在Go中，内置反射机制包括类型断言（type assertion）和type-switch流程控制代码块。

//类型断言
//Go中有四种接口相关的类型转换情形：
//将一个非接口值转换为一个接口类型。在这样的转换中，此非接口值的类型必须实现了此接口类型。
//将一个接口值转换为另一个接口类型（前者接口值的类型实现了后者目标接口类型）。
//将一个接口值转换为一个非接口类型（此非接口类型必须实现了此接口值的接口类型）。
//将一个接口值转换为另一个接口类型（前者接口值的类型未实现后者目标接口类型，但是前者的动态类型有可能实现了目标接口类型）。


//使用类型断言的例子（断言类型为非接口类型）
func main() {
	// 编译器将把123的类型推断为内置类型int。
	var x interface{} = 123

	// 情形一：
	n, ok := x.(int)
	fmt.Println(n, ok) // 123 true
	n = x.(int)
	fmt.Println(n) // 123

	// 情形二：
	a, ok := x.(float64)
	fmt.Println(a, ok) // 0 false

	// 情形三：
	a = x.(float64) // 将产生一个恐慌
}
